基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据 您所在的位置:网站首页 qt 序列化文件 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

2024-07-13 16:59| 来源: 网络整理| 查看: 265

最近要在QT下开发Tcp通讯,发送序列化数据以便于接收。

这里涉及到几个问题:

1.QTcpSocket、QTcpServer的通讯

2.QDataStream序列化数据

 

多的不说,直接上干货!!!

 

 

客户端:

tcpclient.h

1 #ifndef TCPCLIENT_H 2 #define TCPCLIENT_H 3 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 11 12 struct Control_Motor 13 { 14 int length; 15 int command; 16 QString data; 17 }; 18 19 20 class Motor 21 { 22 public: 23 Motor(){} 24 Motor(int speed,int accele_speed,int p_some) 25 { 26 m_speed = speed; 27 m_accele_speed = accele_speed; 28 m_p_some = p_some; 29 } 30 31 32 33 public: 34 int getV(){return m_speed;} 35 int getA(){return m_accele_speed;} 36 int getP(){return m_p_some;} 37 38 void setV(const int v){m_speed = v;} 39 void setA(const int a){m_accele_speed = a;} 40 void setP(const int p){m_p_some = p;} 41 42 43 44 public: 45 //friend QDataStream & operator (QDataStream &in,Motor &motor); 47 /* 48 friend QDataStream & operator abort(); 63 tcpClient->connectToHost(address,port); 64 ui->Connect_Btn->setEnabled(false); 65 } 66 67 void TcpClient::readMessage() 68 { 69 70 } 71 72 void TcpClient::displayError(QAbstractSocket::SocketError) 73 { 74 qDebug() errorString(); 75 } 76 77 void TcpClient::sendMessage() 78 { 79 QString stringMotor = ui->ldt_Motor->text(); 80 QString stringData = ui->ldt_data->text(); 81 control_Motor.command = stringMotor.toInt(); 82 int dataLength = stringData.length(); 83 control_Motor.length = 8 + dataLength; 84 control_Motor.data = stringData; 85 QString data = stringMotor+stringData; 86 87 m_motor = new Motor(20,40,60); 88 89 //Motor m_motor(20,40,60); 90 91 //用于暂存要发送的数据 92 QByteArray block; 93 //使用数据流写入数据 94 QDataStream out(&block,QIODevice::WriteOnly); 95 //设置数据流的版本,客户端和服务器端使用的版本要相同 96 out.setVersion(QDataStream::Qt_4_6); 97 outsetupUi(this); 10 port = 8080; 11 QString address = QNetworkInterface::allAddresses().first().toString(); 12 QList list2 = QNetworkInterface::allAddresses(); 13 foreach (QHostAddress address, list2) 14 { 15 if(address.protocol() == QAbstractSocket::IPv4Protocol) 16 ui->ldt_IP->setText(address.toString()); 17 } 18 ui->ldt_Port->setText(QString::number(port)); 19 connect(ui->Connect_Btn,SIGNAL(clicked()),this,SLOT(slotCreateServer())); 20 } 21 22 TcpServer::~TcpServer() 23 { 24 delete ui; 25 } 26 27 void TcpServer::slotCreateServer() 28 { 29 server = new Server(this,port); 30 connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int))); 31 ui->Connect_Btn->setEnabled(false); 32 } 33 34 void TcpServer::updateServer(QString msg, int length) 35 { 36 ui->lwt_Text->addItem(msg.left(length)); 37 }

 

server.h

1 #ifndef SERVER_H 2 #define SERVER_H 3 4 #include 5 #include 6 7 struct Control_Motor 8 { 9 int length; 10 int command; 11 QString data; 12 }; 13 14 15 class Motor 16 { 17 public: 18 Motor(int speed,int accele_speed,int p_some) 19 { 20 m_speed = speed; 21 m_accele_speed = accele_speed; 22 m_p_some = p_some; 23 } 24 25 Motor(){m_speed = 0;} 26 27 28 29 public: 30 int getV(){return m_speed;} 31 int getA(){return m_accele_speed;} 32 int getP(){return m_p_some;} 33 34 void setV(const int v){m_speed = v;} 35 void setA(const int a){m_accele_speed = a;} 36 void setP(const int p){m_p_some = p;} 37 38 39 40 private: 41 int m_speed; 42 int m_accele_speed; 43 int m_p_some; 44 45 }; 46 47 48 49 class Server : public QTcpServer 50 { 51 Q_OBJECT 52 53 public: 54 Server(QObject *parents=0,int port=0); 55 QListTcpClientSocketList; 56 QTcpSocket *tcpClientSocket; 57 signals: 58 void updateServer(QString,int); 59 60 public slots: 61 void slotUpdateClient(QString,int); 62 void slotDisconnect(int); 63 // void slotnewconnection(); 64 protected: 65 void incomingConnection(int socketDescriptor); 66 67 signals: 68 void updateClients(QString,int); 69 void disconnected(int); 70 71 protected slots: 72 void dataReceive(); 73 void slotDisconnected(); 74 75 public: 76 Control_Motor control_motor; 77 Motor m_mtor; 78 }; 79 80 #endif // SERVER_H

 

server.cpp

1 #include "server.h" 2 3 QDataStream &operator > accele_speed; 17 18 motor.setV(speed); 19 motor.setP(p_some); 20 motor.setA(accele_speed); 21 22 return in; 23 } 24 25 26 27 28 Server::Server(QObject *parent,int port) : 29 QTcpServer(parent) 30 { 31 this->listen(QHostAddress::Any,port); 32 } 33 34 void Server::incomingConnection(int socketDescriptor) 35 { 36 tcpClientSocket = new QTcpSocket(this); 37 //tcpClientSocket = this->nextPendingConnection(); 38 tcpClientSocket->setSocketDescriptor(socketDescriptor); 39 TcpClientSocketList.append(tcpClientSocket); 40 //connect(this,SIGNAL(updateClients(QString,int)),this,SLOT(slotUpdateClient(QString,int))); 41 //connect(this,SIGNAL(updateClients(QString,int)),this,SLOT(slotUpdateClient(QString,int))); 42 connect(this,SIGNAL(disconnected(int)),this,SLOT(slotDisconnect(int))); 43 connect(tcpClientSocket,SIGNAL(readyRead()),this,SLOT(dataReceive())); 44 connect(tcpClientSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected())); 45 //connect(tcpClientSocket,SIGNAL(disconnected()),tcpClientSocket,SLOT(deleteLater())); 46 47 } 48 void Server::slotUpdateClient(QString msg,int length) 49 { 50 emit updateServer(msg,length); 51 for (int i=0;iwrite(msg.toLatin1(),length)!=length) 55 continue; 56 } 57 } 58 void Server::slotDisconnect(int socketDescriptor) 59 { 60 qDebug()control_motor.data; 101 102 //qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有